package com.admin.server.dao;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Set;

import javax.jdo.Extent;
import javax.jdo.PersistenceManager;
import javax.jdo.Query;

import com.admin.server.config.PMF;
import com.admin.server.domain.Privilegio;
import com.admin.server.domain.Rol;
import com.admin.server.domain.Usuario;
import com.admin.share.model.PrivilegioDTO;
import com.admin.share.model.RolDTO;
import com.admin.share.model.UsuarioDTO;
import com.google.appengine.api.datastore.Key;
import com.google.appengine.api.datastore.KeyFactory;


public class Usuarios {
	//Used by Login ServiceImpl
	public static UsuarioDTO validarResponsable(UsuarioDTO tda){
		Usuario val;
		
		PersistenceManager pm = PMF.get().getPersistenceManager();
		Query query = pm.newQuery(Usuario.class);
		try{
			query.setFilter("usuario == :us && clave == :cl");
			query.setUnique(true);
			val = (Usuario)query.execute(tda.getUsuario(), tda.getClave());
			
		}finally{
			pm.close();
			query.closeAll();
		}
		return Usuario.toDTO(val);
	}

	public static UsuarioDTO getResponsable(String username) {
		Usuario val;
		
		PersistenceManager pm = PMF.get().getPersistenceManager();
		Query query = pm.newQuery(Usuario.class);
		try{
			query.setFilter("usuario == :us");
			query.setUnique(true);
			val = (Usuario)query.execute(username);
			
		}finally{
			pm.close();
			query.closeAll();
		}
		return Usuario.toDTO(val);
	}
	//used by UsuarioServiceImpl
	@SuppressWarnings("unchecked")
	public static UsuarioDTO getTreeUsuario(UsuarioDTO user) {
		List<UsuarioDTO> users = new ArrayList<UsuarioDTO>();
		PersistenceManager pm = PMF.get().getPersistenceManager();
		
		try{			
			if (user == null){//get roles raiz
				Key k = KeyFactory.createKey(Rol.class.getSimpleName(), 7);//root
				Rol rol = pm.getObjectById(Rol.class, k);
				for(Rol item : rol.getChildren()){
					UsuarioDTO userDTO = item.toUsuarioDTO();
					userDTO.setParent_id(null);
					users.add(userDTO);
					//System.out.println("raiz "+ userDTO.getId());
				}
			}else if(user.getHaschildren() == null && user.getHasusers() != null){//get usuarios
				String rol_id = user.getId();
				System.out.println("rol_id "+rol_id);
				Key rol_key = KeyFactory.stringToKey(rol_id);
				Rol rol = pm.getObjectById(Rol.class, rol_key);
				Set<Key> user_keys = rol.getUsuario_ids(); 
				Query query = pm.newQuery("select from "+Usuario.class.getName()+" where key == :keys ");
				List<Usuario> user_list = (List<Usuario>)query.execute(user_keys);
				for(Usuario item: user_list){
					UsuarioDTO userDTO = item.toUsuarioDTO();
					userDTO.setParent_id(rol_id);
					users.add(userDTO);
				}
			}else if(user.getHaschildren() != null && user.getHasusers() == null){//getRolesHijos
				String rol_id = user.getId();
				Key rol_key = KeyFactory.stringToKey(rol_id);
				Rol rol = pm.getObjectById(Rol.class, rol_key);
				for(Rol item: rol.getChildren()){
					UsuarioDTO userDTO = item.toUsuarioDTO();
					userDTO.setParent_id(rol_id);
					users.add(userDTO);
				}
			}else if(user.getHaschildren() != null && user.getHasusers() != null){//getRolesUsuarios
				String rol_id = user.getId();
				Key rol_key = KeyFactory.stringToKey(rol_id);
				Rol rol = pm.getObjectById(Rol.class, rol_key);
				for(Rol item: rol.getChildren()){
					UsuarioDTO userDTO = item.toUsuarioDTO();
					userDTO.setParent_id(rol_id);
					users.add(userDTO);
				}
				
				Set<Key> user_keys = rol.getUsuario_ids(); 
				Query query = pm.newQuery("select from "+Usuario.class.getName()+" where key == :keys ");
				List<Usuario> user_list = (List<Usuario>)query.execute(user_keys);
				for(Usuario item: user_list){
					UsuarioDTO userDTO = item.toUsuarioDTO();
					userDTO.setParent_id(rol_id);
					users.add(userDTO);
				}
			}
		}finally{
			pm.close();
		}
		UsuarioDTO root = new UsuarioDTO();
		for (int i = 0; i < users.size(); i++) {
			UsuarioDTO usuario = (UsuarioDTO) users.get(i);			
			root.add(usuario);
		}
		return root;
	}

	@SuppressWarnings("unchecked")
	public static List<RolDTO> getRoles(String id) {
		PersistenceManager pm = PMF.get().getPersistenceManager();
		Key user_key = KeyFactory.stringToKey(id);
		List<RolDTO> data = new ArrayList<RolDTO>();
		try{
			Usuario user = pm.getObjectById(Usuario.class, user_key);
			Set<Key> rol_keys = user.getRol_ids();
			Query query = pm.newQuery("select from "+Rol.class.getName()+" where id == :keys ");
			List<Rol> rol_list = (List<Rol>)query.execute(rol_keys);
			for(Rol rol: rol_list){
				RolDTO rolDTO = rol.toDTO();
				rolDTO.setId(id);
				data.add(rolDTO);
			}
		}finally{
			pm.close();
		}
		return data;
	}

	@SuppressWarnings({ "rawtypes", "unchecked" })
	public static List<PrivilegioDTO> getPrivilegios() {
		PersistenceManager pm = PMF.get().getPersistenceManager();
		List<PrivilegioDTO> data = new ArrayList<PrivilegioDTO>();
		try{
			//Query query = pm.newQuery(Privilegio.class);
			//List<Privilegio> list = (List<Privilegio>)query.execute();
			Extent extent = pm.getExtent(Privilegio.class, false);
			for (Iterator<Privilegio> iter = extent.iterator(); iter.hasNext();) {
				Privilegio pr = iter.next();
				PrivilegioDTO prDTO = pr.toDTO();
				
			}
			
			extent.closeAll();
		}finally{
			
			pm.close();
		}
		
		return data;
	}
	
}
